package com.my.study.dev.demo;

import com.my.study.dev.demo.support.AStockPermissionCheckStrategy;
import com.my.study.dev.demo.support.FundPermissionCheckStrategy;
import com.my.study.dev.demo.support.HKStockPermissionCheckStrategy;

/**
 * 场景：
 * <p>
 *     深度资料有A股、港股、基金等类型，需要对不同类型进行访问权限校验。
 * </p>
 * 
 * <p>
 *     方案：
 *     为了更好的扩展，使用策略模式进行权限校验设计。后续有新增类型时，不需要修改原有代码，而是直接新增校验策略。
 *     
 *     基类：PermissionCheckStrategy，定义校验协议
 *     策略上下文：PermissionCheckContext，存放不同策略实现类
 * </p>
 * 
 * 
 * 
 * @author Carlos
 * @version 1.0.0
 * @date 2023/4/11 19:28
 */
public class Main {


    public static void main(String[] args) {
        // 1.项目初始化时，可以将校验策略加载到Context中
        PermissionCheckContext.putStrategy("A", new AStockPermissionCheckStrategy());
        PermissionCheckContext.putStrategy("HK", new HKStockPermissionCheckStrategy());
        PermissionCheckContext.putStrategy("FUND", new FundPermissionCheckStrategy());
        
        
        // 2. 请求
        RequestDto request1 = new RequestDto("A", "A");
        PermissionCheckStrategy aStockStrategy = PermissionCheckContext.getStrategy(request1.getType());
        boolean check1 = aStockStrategy.check(request1);
        System.out.println("校验结果：" + check1);

        RequestDto request2 = new RequestDto("A", "A1");
        PermissionCheckStrategy aStockStrategy2 = PermissionCheckContext.getStrategy(request1.getType());
        boolean check2 = aStockStrategy2.check(request2);
        System.out.println("校验结果：" + check2);
    }
    
}
